package pickbook.controller;


import java.util.Calendar;
import java.util.HashMap;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import pickbook.model.ListVO;
import pickbook.model.MemberService;
import pickbook.model.MemberVO;
import pickbook.model.MsgVO;
import pickbook.model.UnivListVO;

//회원 관련 컨트롤러 정의
@Controller
public class MemberController {
	
	@Resource(name="memberServiceImpl")
	private MemberService memberService;
	
	/**
	 * method : loginMemberView
	 * comment : 회원 로그인 화면페이지로 이동하는 메서드
	 * 
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-02
	 */
	@RequestMapping("loginMemberView.do")
	public String loginMemberView(){
		return "member.login";
	}
	
	/**
	 * method : registerMemberView
	 * comment : 회원 가입 화면페이지로 이동하는 메서드
	 * 
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-02
	 */
	@RequestMapping("registerMemberView.do")
	public String registerMemberView(){
		return "member.register";
	}	
	
	/**
	 * method : myPageView
	 * comment : 마이페이지 화면으로 이동하는 메서드
	 * 
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-05
	 */
	@RequestMapping("auth_mypageView.do")
	public String myPageView(){
		return "member.mypage";
	}	
	
	/**
	 * method : updateMemberView
	 * comment : 내정보수정 페이지로 이동하는 메서드
	 * 
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-05
	 */
	@RequestMapping("auth_updateMemberView.do")
	public String updateMemberView(){
		return "member.update";
	}	
	
	/**
	 * method : findById
	 * comment : 회원 ID로 정보를 검색하는 메서드
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-05
	 */
	@RequestMapping("auth_findById.do")
	@ResponseBody
	public ModelAndView findById(String id){
		
		MemberVO mvo=memberService.findById(id);//회원아이디로 회원정보 검색
		ModelAndView mv=new ModelAndView("member/member_phoneNumber","findMvo",mvo);
		
		return mv;
		
	}
	
	/**
	 * method : idCheck
	 * comment : 회원 가입 시 아이디 중복 체크 메서드
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-02
	 */
	@RequestMapping("idcheck.do")
	@ResponseBody
	public HashMap idCheck(String id){
		
		HashMap map=new HashMap();
		map.put("flag", memberService.idCheck(id));//중복여부를 HashMap형태로 반환
		
		return map;
		
	}

	/**
	 * method : register
	 * comment : 가입 정보를 통해 회원 DB에 저장
	 * 
	 * @param mvo
	 * @param location
	 * @param univ
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-02
	 */
	@RequestMapping("registerMember.do")
	public String register(MemberVO mvo,String location, String univ){
		
		mvo.setUvo(new UnivListVO(univ,location));//MemberVO에 지역, 대학을 셋팅
		memberService.register(mvo);//회원정보 등록
		
		return "redirect:book_recent_list.do";
		
	}
	
	/**
	 * method : update
	 * comment : 변경된 회원 정보로 업데이트
	 * 
	 * @param session
	 * @param mvo
	 * @param location
	 * @param univ
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-03
	 */
	@RequestMapping("auth_memberUpdate.do")
	public String update(HttpSession session,MemberVO mvo,String location, String univ){
		
		mvo.setUvo(new UnivListVO(univ,location));
		memberService.update(mvo);//회원정보 수정
		
		session.setAttribute("mvo", mvo);//로그인 회원 세션 새로 셋팅
		
		return "member.update_ok";
		
	}
	
	/**
	 * method : withdraw
	 * comment : 회원 DB에서 id에 해당하는 회원 삭제
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-02
	 */
	@RequestMapping("auth_memberWithdraw.do")
	public String withdraw(String id){
		
		memberService.withdraw(id);//회원 탈퇴(삭제)
		
		return "redirect:auth_logoutMember.do";
		
	}
	
	/**
	 * method : loginMember
	 * comment : 회원 로그인 작업 후 성공여부에 따라 viewName 반환
	 * 
	 * @param session
	 * @param mvo
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-02
	 */
	@RequestMapping(value="loginMember.do",method=RequestMethod.POST)
	public String loginMember(HttpServletResponse response,HttpSession session,MemberVO mvo,String autoLogin){
		if(autoLogin.equals("on")){
			String memberInfo="";
			memberInfo=mvo.getId()+"/"+mvo.getPassword();//회원아이디/비밀번호 
			
			//쿠키에 회원정보 저장
			Cookie userCookie=new Cookie("pickbook_autoLogin",memberInfo);
			userCookie.setMaxAge(3600);//하루 자동로그인 유지
			response.addCookie(userCookie);
		}
		
		MemberVO rvo=memberService.loginMember(mvo);
		String viewName="member.login_fail";
		
		if(rvo!=null){//아이디, 비밀번호에 맞는 회원이 존재하면,
			viewName="member.login_ok";
			session.setAttribute("mvo", rvo);
		}
		
		return viewName;
		
	}
	
	/**
	 * method : logoutMember
	 * comment : 회원 로그아웃 수행 메서드
	 * @param session
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-10
	 */
	@RequestMapping("auth_logoutMember.do")
	public String logoutMember(HttpSession session){
		
		MemberVO mvo=(MemberVO)session.getAttribute("mvo");//로그인한 회원정보
		memberService.updateMsgTotal(mvo.getId(),mvo.getMsgTotal());//로그아웃 시 확인한 메시지 갯수 업데이트
		
		session.invalidate();//세션 종료
		
		return "redirect:book_recent_list.do";
	}
	
	/**
	 * method : sendMsg
	 * comment : 픽하기 메시지 보내는 작업에 대한 메서드
	 * 
	 * @param session
	 * @return
	 * 
	 * @author 김병각, 제형규, 이형철
	 * @date 2014-07-09
	 */
	@RequestMapping("auth_sendMsg.do")
	@ResponseBody
	public String sendMsg(HttpSession session,String recId,String bookInfo, String bookType){
		
		Calendar nowDate=Calendar.getInstance();
		
		//현재 날짜
		String date=nowDate.get(Calendar.YEAR)+"년"
							+nowDate.get(Calendar.MONTH)+"월"
							+nowDate.get(Calendar.DATE)+"일"
							+nowDate.get(Calendar.HOUR)+"시"
							+nowDate.get(Calendar.MINUTE)+"분";
		
		MemberVO mvo=(MemberVO)session.getAttribute("mvo");
		
		if(mvo.getPhone()==null){//회원의 휴대폰 번호 정보가 없을 경우
			mvo.setPhone("휴대폰 번호 없음");
		}

		MsgVO msgvo=new MsgVO(0,mvo.getId(),mvo.getPhone(),recId,bookInfo,date,bookType);
		
		memberService.sendMsg(msgvo);//메시지 전송
		
		return "success";
		
	}
	
	/**
	 * method : pickMsgList
	 * comment : 전체 pick 메시지 목록을 반환하는 메서드
	 * 
	 * @param session
	 * @param pageNo
	 * @return
	 * 
	 * @author 김병각, 제형규, 이형철
	 * @date 2014-07-09
	 */
	@RequestMapping("auth_pickmsgList.do")
	public ModelAndView pickMsgList(HttpSession session, String pageNo){
		
		MemberVO mvo=(MemberVO)session.getAttribute("mvo");
		mvo.setMsgTotal(memberService.getTotalPickMsgList(mvo.getId()));//전체 메시지 갯수
		
		String id=((MemberVO)session.getAttribute("mvo")).getId();
		
		ModelAndView mv=new ModelAndView();
		
		ListVO lvo = memberService.getPickMsgListById(id, pageNo);//회원아이디에 해당하는 페이징 처리된 메시지 목록
		
		if(lvo.getList().size()==0){//메시지가 존재하지 않을 경우
			mv=new ModelAndView("member.pickMsg_list","noData",false);
		}else{//존재할 경우
			mv=new ModelAndView("member.pickMsg_list","pickMsgList",lvo);
		}
		
		return mv;
		
	}
	
	/**
	 * method : deletePickMsg
	 * comment : pick 메시지를 삭제하는 메서드
	 * @param no
	 * @return
	 * 
	 * @author 김병각, 제형규, 이형철
	 * @date 2014-07-10
	 */
	@RequestMapping("auth_deleteMsg.do")
	public String deletePickMsg(HttpSession session,String no){
		
		memberService.deletePickMsg(Integer.parseInt(no)) ;//메시지 삭제
		
		MemberVO mvo=(MemberVO)session.getAttribute("mvo");
		memberService.updateMsgTotal(mvo.getId(),mvo.getMsgTotal());//삭제 후 메시지 갯수 업데이트
		
		return "member.deletePickMsg_ok";
		
	}

	/**
	 * method : getPickMsgTotal
	 * comment : 전체 메시지 갯수 반환하는 메서드
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 김병각, 제형규, 이형철
	 * @date 2014-07-09
	 */
	@RequestMapping("getPickMsgTotal.do")
	@ResponseBody
	public int getPickMsgTotal(HttpSession session,String id){
		
		int msgTotal=memberService.getTotalPickMsgList(id);//실시간 pick 메시지 갯수
		int originTotal=(int)((MemberVO)session.getAttribute("mvo")).getMsgTotal();//기존 pick 메시지 갯수

		int result=msgTotal-originTotal;//확인하지 않은 메시지 갯수 결과
		
		if(result>0){//확인하지 않은 메시지가 존재할 경우
			return result;
		}else{//모두 확인하였을 경우
			return 0;
		}
	}
	
	/**
	 * method :deleteAllMsg
	 * comment : 전체 pick 메시지를 삭제하는 메서드
	 * 
	 * @return
	 * 
	 * @author 김병각,제형규,이형철
	 * @date 2014-07-11
	 */
	@RequestMapping("auth_deleteAllPickMsg.do")
	public String deleteAllPickMsg(HttpSession session){
		memberService.deleteAllPickMsg(((MemberVO)session.getAttribute("mvo")).getId());	//회원아이디에 해당하는 메시지 모두 삭제
		return "member.deleteAllPickMsg_ok";
	}
}
